#!/bin/bash

# 3x-ui Linux构建脚本 (macOS交叉编译版本 - 支持CGO/SQLite)
# 解决SQLite依赖的CGO问题

set -e

# 默认平台为amd64
PLATFORM=${1:-amd64}

echo "开始构建 3x-ui Linux-${PLATFORM} 版本 (macOS交叉编译 - CGO支持)..."

# 检查必要的工具
if ! command -v go &> /dev/null; then
    echo "错误: 未找到Go编译器，请先安装Go"
    exit 1
fi

if ! command -v wget &> /dev/null && ! command -v curl &> /dev/null; then
    echo "错误: 未找到wget或curl，请先安装其中一个"
    echo "安装wget: brew install wget"
    echo "或使用系统自带的curl"
    exit 1
fi

if ! command -v unzip &> /dev/null; then
    echo "错误: 未找到unzip"
    exit 1
fi

# 选择下载工具
if command -v wget &> /dev/null; then
    DOWNLOAD_CMD="wget -q --timeout=30 --tries=3"
    DOWNLOAD_OUTPUT_FLAG="-O"
else
    DOWNLOAD_CMD="curl -L -s --connect-timeout 30 --retry 3"
    DOWNLOAD_OUTPUT_FLAG="-o"
fi

# 设置构建环境
export CGO_ENABLED=1  # 启用CGO以支持SQLite
export GOOS=linux

# 根据平台设置相应的环境变量和交叉编译器
case $PLATFORM in
    "amd64")
        export GOARCH=amd64
        XRAY_FILE="Xray-linux-64.zip"
        # 对于amd64，通常可以直接编译
        ;;
    "arm64")
        export GOARCH=arm64
        XRAY_FILE="Xray-linux-arm64-v8a.zip"
        # 需要交叉编译器
        if command -v aarch64-linux-gnu-gcc &> /dev/null; then
            export CC=aarch64-linux-gnu-gcc
            export CXX=aarch64-linux-gnu-g++
        else
            echo "警告: 未找到aarch64-linux-gnu-gcc交叉编译器"
            echo "尝试使用Docker方式或在Linux环境下编译"
        fi
        ;;
    "armv7")
        export GOARCH=arm
        export GOARM=7
        XRAY_FILE="Xray-linux-arm32-v7a.zip"
        if command -v arm-linux-gnueabihf-gcc &> /dev/null; then
            export CC=arm-linux-gnueabihf-gcc
            export CXX=arm-linux-gnueabihf-g++
        else
            echo "警告: 未找到arm-linux-gnueabihf-gcc交叉编译器"
        fi
        ;;
    "armv6")
        export GOARCH=arm
        export GOARM=6
        XRAY_FILE="Xray-linux-arm32-v6.zip"
        if command -v arm-linux-gnueabihf-gcc &> /dev/null; then
            export CC=arm-linux-gnueabihf-gcc
            export CXX=arm-linux-gnueabihf-g++
        else
            echo "警告: 未找到arm-linux-gnueabihf-gcc交叉编译器"
        fi
        ;;
    "386")
        export GOARCH=386
        XRAY_FILE="Xray-linux-32.zip"
        if command -v i686-linux-gnu-gcc &> /dev/null; then
            export CC=i686-linux-gnu-gcc
            export CXX=i686-linux-gnu-g++
        else
            echo "警告: 未找到i686-linux-gnu-gcc交叉编译器"
        fi
        ;;
    "armv5")
        export GOARCH=arm
        export GOARM=5
        XRAY_FILE="Xray-linux-arm32-v5.zip"
        if command -v arm-linux-gnueabi-gcc &> /dev/null; then
            export CC=arm-linux-gnueabi-gcc
            export CXX=arm-linux-gnueabi-g++
        else
            echo "警告: 未找到arm-linux-gnueabi-gcc交叉编译器"
        fi
        ;;
    "s390x")
        export GOARCH=s390x
        XRAY_FILE="Xray-linux-s390x.zip"
        if command -v s390x-linux-gnu-gcc &> /dev/null; then
            export CC=s390x-linux-gnu-gcc
            export CXX=s390x-linux-gnu-g++
        else
            echo "警告: 未找到s390x-linux-gnu-gcc交叉编译器"
        fi
        ;;
    *)
        echo "不支持的平台: $PLATFORM"
        echo "支持的平台: amd64, arm64, armv7, armv6, 386, armv5, s390x"
        exit 1
        ;;
esac

echo "构建平台: ${GOOS}-${GOARCH}"
echo "CGO状态: ${CGO_ENABLED}"
if [ ! -z "$CC" ]; then
    echo "交叉编译器: $CC"
fi

# 设置CGO编译标志
export CGO_CFLAGS="-D_GNU_SOURCE"
export CGO_LDFLAGS=""

# 构建主程序
echo "正在构建主程序..."

# 尝试不同的构建选项
BUILD_SUCCESS=false

# 方法1: 标准CGO构建
echo "尝试方法1: 标准CGO构建..."
if go build -ldflags "-w -s" -o xui-release -v main.go 2>/dev/null; then
    echo "✓ 标准CGO构建成功"
    BUILD_SUCCESS=true
else
    echo "✗ 标准CGO构建失败"
fi

# 方法2: 使用静态链接
if [ "$BUILD_SUCCESS" = false ]; then
    echo "尝试方法2: 静态链接构建..."
    if go build -ldflags "-w -s -linkmode external -extldflags '-static'" -o xui-release -v main.go 2>/dev/null; then
        echo "✓ 静态链接构建成功"
        BUILD_SUCCESS=true
    else
        echo "✗ 静态链接构建失败"
    fi
fi

# 方法3: 使用纯Go SQLite驱动 (modernc.org/sqlite)
if [ "$BUILD_SUCCESS" = false ]; then
    echo "尝试方法3: 使用纯Go SQLite驱动..."
    echo "注意: 这需要修改代码以使用 modernc.org/sqlite 驱动"
    echo "建议在Linux环境下编译或使用Docker"

    # 临时禁用CGO，使用纯Go构建（但SQLite功能可能受限）
    export CGO_ENABLED=0
    if go build -ldflags "-w -s" -tags "netgo" -o xui-release -v main.go 2>/dev/null; then
        echo "⚠ 纯Go构建成功，但SQLite功能可能受限"
        echo "⚠ 建议在Linux环境下重新编译以获得完整功能"
        BUILD_SUCCESS=true
    else
        echo "✗ 纯Go构建也失败"
    fi
fi

if [ "$BUILD_SUCCESS" = false ]; then
    echo ""
    echo "========================================="
    echo "构建失败！"
    echo "========================================="
    echo "建议的解决方案："
    echo ""
    echo "1. 使用Docker构建（推荐）："
    echo "   docker build -t 3x-ui ."
    echo ""
    echo "2. 在Linux环境下编译："
    echo "   - 使用Linux虚拟机"
    echo "   - 使用GitHub Actions"
    echo "   - 使用云服务器"
    echo ""
    echo "3. 安装交叉编译工具链："
    echo "   brew install FiloSottile/musl-cross/musl-cross"
    echo "   # 然后设置相应的CC环境变量"
    echo ""
    echo "4. 修改代码使用纯Go SQLite驱动："
    echo "   将 gorm.io/driver/sqlite 替换为支持纯Go的驱动"
    echo ""
    exit 1
fi

echo "主程序构建成功"

# 创建发布目录
echo "创建发布目录..."
rm -rf x-ui
mkdir -p x-ui/bin

# 复制文件
cp xui-release x-ui/x-ui
cp x-ui.service x-ui/
cp x-ui.sh x-ui/
chmod +x x-ui/x-ui x-ui/x-ui.sh

# 下载Xray核心和地理位置数据
echo "下载Xray核心和地理位置数据..."
cd x-ui/bin

# 下载Xray核心
XRAY_URL="https://github.com/XTLS/Xray-core/releases/download/v25.7.26/"
echo "下载 ${XRAY_FILE}..."
if ! $DOWNLOAD_CMD ${XRAY_URL}${XRAY_FILE}; then
    echo "警告: Xray核心下载失败，请手动下载"
else
    unzip -q ${XRAY_FILE}
    rm -f ${XRAY_FILE}
    # 重命名xray可执行文件
    if [ -f xray ]; then
        mv xray xray-linux-${PLATFORM}
        echo "Xray核心下载成功"
    fi
fi

# 下载地理位置数据文件
echo "下载地理位置数据文件..."
rm -f geoip.dat geosite.dat

# 下载基础地理位置数据
if $DOWNLOAD_CMD https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat; then
    echo "geoip.dat 下载成功"
else
    echo "警告: geoip.dat 下载失败"
fi

if $DOWNLOAD_CMD https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat; then
    echo "geosite.dat 下载成功"
else
    echo "警告: geosite.dat 下载失败"
fi

# 下载区域特定的地理位置数据
echo "下载区域特定地理位置数据..."
$DOWNLOAD_CMD $DOWNLOAD_OUTPUT_FLAG geoip_IR.dat https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat || echo "警告: geoip_IR.dat 下载失败"
$DOWNLOAD_CMD $DOWNLOAD_OUTPUT_FLAG geosite_IR.dat https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat || echo "警告: geosite_IR.dat 下载失败"
$DOWNLOAD_CMD $DOWNLOAD_OUTPUT_FLAG geoip_RU.dat https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat || echo "警告: geoip_RU.dat 下载失败"
$DOWNLOAD_CMD $DOWNLOAD_OUTPUT_FLAG geosite_RU.dat https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat || echo "警告: geosite_RU.dat 下载失败"

cd ../..

# 打包
echo "打包文件..."
tar -zcvf x-ui-linux-${PLATFORM}.tar.gz x-ui

echo ""
echo "========================================="
echo "构建完成！"
echo "========================================="
echo "输出文件: x-ui-linux-${PLATFORM}.tar.gz"
echo "文件大小: $(du -h x-ui-linux-${PLATFORM}.tar.gz | cut -f1)"
echo ""
echo "部署说明:"
echo "1. 上传到Linux服务器: scp x-ui-linux-${PLATFORM}.tar.gz user@server:/tmp/"
echo "2. 在服务器上解压: tar -zxvf x-ui-linux-${PLATFORM}.tar.gz"
echo "3. 进入目录: cd x-ui"
echo "4. 运行安装脚本: sudo bash x-ui.sh"
echo "   或者直接运行: sudo ./x-ui"
echo ""
echo "注意事项:"
if [ "$CGO_ENABLED" = "1" ]; then
    echo "- 本版本启用了CGO，支持完整的SQLite功能"
    echo "- 如果在目标系统上运行出现问题，请在Linux环境下重新编译"
else
    echo "- 本版本禁用了CGO，SQLite功能可能受限"
    echo "- 强烈建议在Linux环境下重新编译以获得完整功能"
fi
echo "- 建议在目标Linux系统上测试运行"

# 清理临时文件
rm -f xui-release

echo ""
echo "构建脚本执行完成！"

